/**
* @filename GPIO.h
* @author Martin
* @brief Port configure header file
* @date 2019-07-09
* @version 0.1
* @note initial draft
*/

#ifndef DRIVERS_PORT_PORT_H_
#define DRIVERS_PORT_PORT_H_

#include "S32K144.h"

#undef S32KEVB_Q100


#ifdef S32KEVB_Q100

#else // CS5 - FS32K144HRT0VLLT - 100PIN
/**
 * PTC3 - CAN0_TX
 * PTC2 - CAN0_RX
 */
#define PORT_CAN                 PORTC
#define PORT_CAN_TX_IDX          3u
#define PORT_CAN_RX_IDX          2u

#endif


#define PORTD14_IDX              14u
#define PORTD16_IDX              16u

#define PORT_CLKOUT_IDX          PORTD14_IDX
#define PORT_LED_GREEN_IDX       PORTD16_IDX


typedef enum{
	GPIO_IN = 0,
	GPIO_OUT
}GPIO_Direction;

typedef enum{
	GPIO_Port_A0 = 0,
	GPIO_Port_A1,
	GPIO_Port_A2,
	GPIO_Port_A3,
	GPIO_Port_A4,
	GPIO_Port_A5,
	GPIO_Port_A6,
	GPIO_Port_A7,
	GPIO_Port_A8,
	GPIO_Port_A9,
	GPIO_Port_A10,
	GPIO_Port_A11,
	GPIO_Port_A12,
	GPIO_Port_A13,
	GPIO_Port_A14,
	GPIO_Port_A15,
	GPIO_Port_A16,
	GPIO_Port_A17,
	GPIO_Port_A18,
	GPIO_Port_A19,
	GPIO_Port_A20,
	GPIO_Port_A21,
	GPIO_Port_A22,
	GPIO_Port_A23,
	GPIO_Port_A24,
	GPIO_Port_A25,
	GPIO_Port_A26,
	GPIO_Port_A27,
	GPIO_Port_A28,
	GPIO_Port_A29,
	GPIO_Port_A30,
	GPIO_Port_A31,

	GPIO_Port_B0,
	GPIO_Port_B1,
	GPIO_Port_B2,
	GPIO_Port_B3,
	GPIO_Port_B4,
	GPIO_Port_B5,
	GPIO_Port_B6,
	GPIO_Port_B7,
	GPIO_Port_B8,
	GPIO_Port_B9,
	GPIO_Port_B10,
	GPIO_Port_B11,
	GPIO_Port_B12,
	GPIO_Port_B13,
	GPIO_Port_B14,
	GPIO_Port_B15,
	GPIO_Port_B16,
	GPIO_Port_B17,
	GPIO_Port_B18,
	GPIO_Port_B19,
	GPIO_Port_B20,
	GPIO_Port_B21,
	GPIO_Port_B22,
	GPIO_Port_B23,
	GPIO_Port_B24,
	GPIO_Port_B25,
	GPIO_Port_B26,
	GPIO_Port_B27,
	GPIO_Port_B28,
	GPIO_Port_B29,
	GPIO_Port_B30,
	GPIO_Port_B31,

	GPIO_Port_C0,
	GPIO_Port_C1,
	GPIO_Port_C2,
	GPIO_Port_C3,
	GPIO_Port_C4,
	GPIO_Port_C5,
	GPIO_Port_C6,
	GPIO_Port_C7,
	GPIO_Port_C8,
	GPIO_Port_C9,
	GPIO_Port_C10,
	GPIO_Port_C11,
	GPIO_Port_C12,
	GPIO_Port_C13,
	GPIO_Port_C14,
	GPIO_Port_C15,
	GPIO_Port_C16,
	GPIO_Port_C17,
	GPIO_Port_C18,
	GPIO_Port_C19,
	GPIO_Port_C20,
	GPIO_Port_C21,
	GPIO_Port_C22,
	GPIO_Port_C23,
	GPIO_Port_C24,
	GPIO_Port_C25,
	GPIO_Port_C26,
	GPIO_Port_C27,
	GPIO_Port_C28,
	GPIO_Port_C29,
	GPIO_Port_C30,
	GPIO_Port_C31,

	GPIO_Port_D0,
	GPIO_Port_D1,
	GPIO_Port_D2,
	GPIO_Port_D3,
	GPIO_Port_D4,
	GPIO_Port_D5,
	GPIO_Port_D6,
	GPIO_Port_D7,
	GPIO_Port_D8,
	GPIO_Port_D9,
	GPIO_Port_D10,
	GPIO_Port_D11,
	GPIO_Port_D12,
	GPIO_Port_D13,
	GPIO_Port_D14,
	GPIO_Port_D15,
	GPIO_Port_D16,
	GPIO_Port_D17,
	GPIO_Port_D18,
	GPIO_Port_D19,
	GPIO_Port_D20,
	GPIO_Port_D21,
	GPIO_Port_D22,
	GPIO_Port_D23,
	GPIO_Port_D24,
	GPIO_Port_D25,
	GPIO_Port_D26,
	GPIO_Port_D27,
	GPIO_Port_D28,
	GPIO_Port_D29,
	GPIO_Port_D30,
	GPIO_Port_D31,

	GPIO_Port_E0,
	GPIO_Port_E1,
	GPIO_Port_E2,
	GPIO_Port_E3,
	GPIO_Port_E4,
	GPIO_Port_E5,
	GPIO_Port_E6,
	GPIO_Port_E7,
	GPIO_Port_E8,
	GPIO_Port_E9,
	GPIO_Port_E10,
	GPIO_Port_E11,
	GPIO_Port_E12,
	GPIO_Port_E13,
	GPIO_Port_E14,
	GPIO_Port_E15,
	GPIO_Port_E16,
	GPIO_Port_E17,
	GPIO_Port_E18,
	GPIO_Port_E19,
	GPIO_Port_E20,
	GPIO_Port_E21,
	GPIO_Port_E22,
	GPIO_Port_E23,
	GPIO_Port_E24,
	GPIO_Port_E25,
	GPIO_Port_E26,
	GPIO_Port_E27,
	GPIO_Port_E28,
	GPIO_Port_E29,
	GPIO_Port_E30,
	GPIO_Port_E31,

	GPIO_Port_MAX
}GPIO_Port_Type;

/**
 * Port set output high
 */
static inline void Port_Set(GPIO_Type *pPortGroup, int pinIndex)
{
	pPortGroup->PSOR |= 1 << pinIndex; // Port Set Output
}

/**
 * Port set output low
 */
static inline void Port_Clear(GPIO_Type *pPortGroup, int pinIndex)
{
	pPortGroup->PCOR |= 1 << pinIndex; // Port Clear Output
}

/**
 * Port toggle output
 */
static inline void Port_Toggle(GPIO_Type *pPortGroup, int pinIndex)
{
	pPortGroup->PTOR |= 1 << pinIndex;
}


void Port_Init(void);
void Port_Tja1043GPIOInit(void);
void Port_GPIOInit(GPIO_Port_Type pinNum, GPIO_Direction direction);
uint8_t Port_GPIRead(GPIO_Port_Type pinNum);


#endif /* DRIVERS_PORT_PORT_H_ */
